<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>FabGL: mouse.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">FabGL
   </div>
   <div id="projectbrief">ESP32 Display Controller and Graphics Library</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('mouse_8cpp_source.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">mouse.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - &lt;http://www.fabgl.com&gt;</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">  Copyright (c) 2019-2021 Fabrizio Di Vittorio.</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">  All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">* Please contact fdivitto2013@gmail.com if you need a commercial license.</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">* This library and related software is available under GPL v3.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">  FabGL is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">  it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">  the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">  (at your option) any later version.</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">  FabGL is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment">  GNU General Public License for more details.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment">  You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment">  along with FabGL.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="preprocessor">#include &quot;freertos/FreeRTOS.h&quot;</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="mouse_8h.html">mouse.h</a>&quot;</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ps2controller_8h.html">comdrivers/ps2controller.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="displaycontroller_8h.html">displaycontroller.h</a>&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="preprocessor">#pragma GCC optimize (&quot;O2&quot;)</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacefabgl.html">fabgl</a> {</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="keywordtype">bool</span> Mouse::s_quickCheckHardware = <span class="keyword">false</span>;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;Mouse::Mouse()</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;  : m_mouseAvailable(false),</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    m_mouseType(<a class="code" href="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708.html#gga1a15f1712ba14a6877038ffe9c6f7708a64426cb7833b3604fe0ab5d0eec32edf">LegacyMouse</a>),</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    m_mouseUpdateTask(nullptr),</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    m_receivedPacket(nullptr),</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    m_absoluteUpdate(false),</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    m_prevDeltaTime(0),</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    m_movementAcceleration(180),</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    m_wheelAcceleration(60000),</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    m_absoluteQueue(nullptr),</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    m_updateDisplayController(nullptr),</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    m_uiApp(nullptr)</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;{</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;}</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;Mouse::~Mouse()</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;{</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;  PS2DeviceLock <a class="code" href="classfabgl_1_1_p_s2_device_aae07d4bbfd23897dc1225821077c8df2.html#aae07d4bbfd23897dc1225821077c8df2">lock</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;  <a class="code" href="classfabgl_1_1_mouse_a3f7c9c26b1d53a42eda487efa8f7e546.html#a3f7c9c26b1d53a42eda487efa8f7e546">terminateAbsolutePositioner</a>();</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;  <span class="keywordflow">if</span> (m_mouseUpdateTask)</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    vTaskDelete(m_mouseUpdateTask);</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;  <span class="keywordflow">if</span> (m_receivedPacket)</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    vQueueDelete(m_receivedPacket);</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;}</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a94b7ea8e055cee23e457cec665b0c779.html#a94b7ea8e055cee23e457cec665b0c779">   71</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798.html#a56921ef9b7157bb48751c7517531a798">Mouse::begin</a>(<span class="keywordtype">int</span> PS2Port)</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;{</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;  <span class="keywordflow">if</span> (s_quickCheckHardware)</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    PS2Device::quickCheckHardware();</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;  PS2Device::begin(PS2Port);</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;  <a class="code" href="classfabgl_1_1_mouse_a50910ef42a65d4c139af341f1ef2323f.html#a50910ef42a65d4c139af341f1ef2323f">reset</a>();</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;  m_receivedPacket = xQueueCreate(1, <span class="keyword">sizeof</span>(<a class="code" href="structfabgl_1_1_mouse_packet.html">MousePacket</a>));</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;  xTaskCreate(&amp;mouseUpdateTask, <span class="stringliteral">&quot;&quot;</span>, 1600, <span class="keyword">this</span>, 5, &amp;m_mouseUpdateTask);</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;  m_area = <a class="code" href="structfabgl_1_1_size.html">Size</a>(0, 0);</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;}</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798.html#a56921ef9b7157bb48751c7517531a798">   83</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798.html#a56921ef9b7157bb48751c7517531a798">Mouse::begin</a>(gpio_num_t clkGPIO, gpio_num_t dataGPIO)</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;{</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;  <a class="code" href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">PS2Controller::begin</a>(clkGPIO, dataGPIO);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  PS2Controller::setMouse(<span class="keyword">this</span>);</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;  <a class="code" href="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798.html#a56921ef9b7157bb48751c7517531a798">begin</a>(0);</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;}</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a50910ef42a65d4c139af341f1ef2323f.html#a50910ef42a65d4c139af341f1ef2323f">   91</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classfabgl_1_1_mouse_a50910ef42a65d4c139af341f1ef2323f.html#a50910ef42a65d4c139af341f1ef2323f">Mouse::reset</a>()</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;{</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;  <span class="keywordflow">if</span> (s_quickCheckHardware) {</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    m_mouseAvailable = send_cmdReset();</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="comment">// tries up to three times for mouse reset</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 3; ++i) {</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;      m_mouseAvailable = send_cmdReset();</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;      <span class="keywordflow">if</span> (m_mouseAvailable)</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;      vTaskDelay(500 / portTICK_PERIOD_MS);</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    }</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="comment">// give the time to the device to be fully initialized</span></div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    vTaskDelay(200 / portTICK_PERIOD_MS);</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;  }</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;  <span class="comment">// negotiate compatibility and default parameters</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;  <span class="keywordflow">if</span> (m_mouseAvailable) {</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="comment">// try Intellimouse (three buttons + scroll wheel, 4 bytes packet)</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="keywordflow">if</span> (send_cmdSetSampleRate(200) &amp;&amp; send_cmdSetSampleRate(100) &amp;&amp; send_cmdSetSampleRate(80) &amp;&amp; <a class="code" href="classfabgl_1_1_p_s2_device_ad71b1d9186542ee488f761280b7b76da.html#ad71b1d9186542ee488f761280b7b76da">identify</a>() == <a class="code" href="group___enumerations_gab1e29a3412c837d0e4e7599473e8948f.html#ggab1e29a3412c837d0e4e7599473e8948fa7b1bf224080b249a7253c8c26f56b13f">PS2DeviceType::MouseWithScrollWheel</a>) {</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      <span class="comment">// Intellimouse ok!</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;      m_mouseType = <a class="code" href="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708.html#gga1a15f1712ba14a6877038ffe9c6f7708a2e71c963cb7659a2783aa306391051ec">Intellimouse</a>;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    }</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    <a class="code" href="classfabgl_1_1_mouse_a47344d7eecf20504d7ea80020aaa0b73.html#a47344d7eecf20504d7ea80020aaa0b73">setSampleRate</a>(60);</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;  }</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;  <span class="keywordflow">return</span> m_mouseAvailable;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;}</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa.html#a9f62cc2900d28231ffc61d200af2aafa">  122</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa.html#a9f62cc2900d28231ffc61d200af2aafa">Mouse::getPacketSize</a>()</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;  <span class="keywordflow">return</span> (m_mouseType == <a class="code" href="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708.html#gga1a15f1712ba14a6877038ffe9c6f7708a2e71c963cb7659a2783aa306391051ec">Intellimouse</a> ? 4 : 3);</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;}</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a3fd3cdfc66306ff22b53325aeb4e2c64.html#a3fd3cdfc66306ff22b53325aeb4e2c64">  128</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classfabgl_1_1_mouse_a3fd3cdfc66306ff22b53325aeb4e2c64.html#a3fd3cdfc66306ff22b53325aeb4e2c64">Mouse::packetAvailable</a>()</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;{</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  <span class="keywordflow">return</span> uxQueueMessagesWaiting(m_receivedPacket) &gt; 0;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;}</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a11d4bf156584e08773498e4de00ca1ff.html#a11d4bf156584e08773498e4de00ca1ff">  134</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classfabgl_1_1_mouse_a11d4bf156584e08773498e4de00ca1ff.html#a11d4bf156584e08773498e4de00ca1ff">Mouse::getNextPacket</a>(<a class="code" href="structfabgl_1_1_mouse_packet.html">MousePacket</a> * packet, <span class="keywordtype">int</span> timeOutMS, <span class="keywordtype">bool</span> requestResendOnTimeOut)</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;{</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;  <span class="keywordflow">return</span> xQueueReceive(m_receivedPacket, packet, msToTicks(timeOutMS));</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;}</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a231264f15f33e8986765d7644c0c3615.html#a231264f15f33e8986765d7644c0c3615">  140</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classfabgl_1_1_mouse_a231264f15f33e8986765d7644c0c3615.html#a231264f15f33e8986765d7644c0c3615">Mouse::deltaAvailable</a>()</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;{</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classfabgl_1_1_mouse_a3fd3cdfc66306ff22b53325aeb4e2c64.html#a3fd3cdfc66306ff22b53325aeb4e2c64">packetAvailable</a>();</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;}</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment">// Mouse packet format:</span></div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment">//    byte 0:</span></div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="comment">//       bit 0 = Left Button</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="comment">//       bit 1 = Right Button</span></div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="comment">//       bit 2 = Middle Button</span></div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="comment">//       bit 3 = Always 1</span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="comment">//       bit 4 = X sign bit</span></div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment">//       bit 5 = Y sign bit</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="comment">//       bit 6 = X overflow</span></div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="comment">//       bit 7 = Y overflow</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment">//    byte 1:</span></div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="comment">//       X movement</span></div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment">//    byte 2:</span></div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="comment">//       Y movement</span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="comment">//    byte 3:</span></div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;<span class="comment">//       Z movement</span></div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="keywordtype">bool</span> Mouse::decodeMousePacket(<a class="code" href="structfabgl_1_1_mouse_packet.html">MousePacket</a> * mousePacket, <a class="code" href="structfabgl_1_1_mouse_delta.html">MouseDelta</a> * delta)</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;{</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;  <span class="comment">// the bit 4 of first byte must be always 1</span></div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;  <span class="keywordflow">if</span> ((mousePacket-&gt;data[0] &amp; 8) == 0)</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;  m_prevStatus = m_status;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;  <span class="comment">// decode packet</span></div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">left</a>   = (mousePacket-&gt;data[0] &amp; 0x01 ? 1 : 0);</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">middle</a> = (mousePacket-&gt;data[0] &amp; 0x04 ? 1 : 0);</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">right</a>  = (mousePacket-&gt;data[0] &amp; 0x02 ? 1 : 0);</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;  <span class="keywordflow">if</span> (delta) {</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_aa619bed5b36c23065f6b3c1faf8ac31d.html#aa619bed5b36c23065f6b3c1faf8ac31d">deltaX</a>    = (int16_t)(mousePacket-&gt;data[0] &amp; 0x10 ? 0xFF00 | mousePacket-&gt;data[1] : mousePacket-&gt;data[1]);</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a73ca8a4921ccb094005e774b883df68d.html#a73ca8a4921ccb094005e774b883df68d">deltaY</a>    = (int16_t)(mousePacket-&gt;data[0] &amp; 0x20 ? 0xFF00 | mousePacket-&gt;data[2] : mousePacket-&gt;data[2]);</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a0653e51f2a47ce4166ce2aec3eb3dafb.html#a0653e51f2a47ce4166ce2aec3eb3dafb">deltaZ</a>    = (int8_t)(<a class="code" href="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa.html#a9f62cc2900d28231ffc61d200af2aafa">getPacketSize</a>() &gt; 3 ? mousePacket-&gt;data[3] : 0);</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a3e4810c2db3fe2f9e3a390156574fcd7.html#a3e4810c2db3fe2f9e3a390156574fcd7">overflowX</a> = (mousePacket-&gt;data[0] &amp; 0x40 ? 1 : 0);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a2a35463fd25699d8601ebe3588973323.html#a2a35463fd25699d8601ebe3588973323">overflowY</a> = (mousePacket-&gt;data[0] &amp; 0x80 ? 1 : 0);</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>   = m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;  }</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;}</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a72788b215173ebeed6b8fe0f40368c90.html#a72788b215173ebeed6b8fe0f40368c90">  187</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classfabgl_1_1_mouse_a72788b215173ebeed6b8fe0f40368c90.html#a72788b215173ebeed6b8fe0f40368c90">Mouse::getNextDelta</a>(<a class="code" href="structfabgl_1_1_mouse_delta.html">MouseDelta</a> * delta, <span class="keywordtype">int</span> timeOutMS, <span class="keywordtype">bool</span> requestResendOnTimeOut)</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;{</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;  <a class="code" href="structfabgl_1_1_mouse_packet.html">MousePacket</a> mousePacket;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classfabgl_1_1_mouse_a11d4bf156584e08773498e4de00ca1ff.html#a11d4bf156584e08773498e4de00ca1ff">getNextPacket</a>(&amp;mousePacket, timeOutMS, requestResendOnTimeOut) &amp;&amp; decodeMousePacket(&amp;mousePacket, delta);</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;}</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;</div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a3a139c6e0877d280a65924a0092a7f76.html#a3a139c6e0877d280a65924a0092a7f76">  194</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_a3a139c6e0877d280a65924a0092a7f76.html#a3a139c6e0877d280a65924a0092a7f76">Mouse::setupAbsolutePositioner</a>(<span class="keywordtype">int</span> <a class="code" href="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476.html#a09a2a45f731b02946ff6d3cd15c1a476">width</a>, <span class="keywordtype">int</span> <a class="code" href="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594.html#adcf201a8aabf55cb352ec05331242594">height</a>, <span class="keywordtype">bool</span> createAbsolutePositionsQueue, <a class="code" href="classfabgl_1_1_bitmapped_display_controller.html">BitmappedDisplayController</a> * updateDisplayController, <a class="code" href="classfabgl_1_1ui_app.html">uiApp</a> * app)</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;{</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;  <span class="keywordflow">if</span> (m_area != <a class="code" href="structfabgl_1_1_size.html">Size</a>(<a class="code" href="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476.html#a09a2a45f731b02946ff6d3cd15c1a476">width</a>, <a class="code" href="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594.html#adcf201a8aabf55cb352ec05331242594">height</a>)) {</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    m_area                  = <a class="code" href="structfabgl_1_1_size.html">Size</a>(<a class="code" href="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476.html#a09a2a45f731b02946ff6d3cd15c1a476">width</a>, <a class="code" href="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594.html#adcf201a8aabf55cb352ec05331242594">height</a>);</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a>              = <a class="code" href="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476.html#a09a2a45f731b02946ff6d3cd15c1a476">width</a> &gt;&gt; 1;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a>              = <a class="code" href="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594.html#adcf201a8aabf55cb352ec05331242594">height</a> &gt;&gt; 1;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;  }</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_ac1cf6a18b13ddfb1d9d76322097f3c0f.html#ac1cf6a18b13ddfb1d9d76322097f3c0f">wheelDelta</a>     = 0;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">left</a>   = 0;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">middle</a> = 0;</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">right</a>  = 0;</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;  m_prevStatus            = m_status;</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;  m_updateDisplayController = updateDisplayController;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;  m_uiApp = app;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;  <span class="keywordflow">if</span> (createAbsolutePositionsQueue &amp;&amp; m_absoluteQueue == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    m_absoluteQueue = xQueueCreate(<a class="code" href="fabglconf_8h_a4ed8f72017c1de9d95dedeb6e37b199b.html#a4ed8f72017c1de9d95dedeb6e37b199b">FABGLIB_MOUSE_EVENTS_QUEUE_SIZE</a>, <span class="keyword">sizeof</span>(<a class="code" href="structfabgl_1_1_mouse_status.html">MouseStatus</a>));</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;  }</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;  <span class="keywordflow">if</span> (m_updateDisplayController) {</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    <span class="comment">// setup initial position</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    m_updateDisplayController-&gt;<a class="code" href="classfabgl_1_1_bitmapped_display_controller_ae0897f2355f7462b5ab003083418e3b4.html#ae0897f2355f7462b5ab003083418e3b4">setMouseCursorPos</a>(m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a>, m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a>);</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;  }</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;  m_absoluteUpdate = (m_updateDisplayController || createAbsolutePositionsQueue || m_uiApp);</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;}</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_a3f7c9c26b1d53a42eda487efa8f7e546.html#a3f7c9c26b1d53a42eda487efa8f7e546">  224</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_a3f7c9c26b1d53a42eda487efa8f7e546.html#a3f7c9c26b1d53a42eda487efa8f7e546">Mouse::terminateAbsolutePositioner</a>()</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;{</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;  <span class="keywordflow">if</span> (m_absoluteQueue) {</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    vQueueDelete(m_absoluteQueue);</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    m_absoluteQueue = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;  }</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;  m_absoluteUpdate = <span class="keyword">false</span>;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;  m_updateDisplayController = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;  m_uiApp = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;}</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_af43b281ab7ec8480fc8ea6092f01a12a.html#af43b281ab7ec8480fc8ea6092f01a12a">  236</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_af43b281ab7ec8480fc8ea6092f01a12a.html#af43b281ab7ec8480fc8ea6092f01a12a">Mouse::updateAbsolutePosition</a>(<a class="code" href="structfabgl_1_1_mouse_delta.html">MouseDelta</a> * delta)</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;{</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">int</span> maxDeltaTimeUS = 500000; <span class="comment">// after 0.5s doesn&#39;t consider acceleration</span></div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;  <span class="keywordtype">int</span> dx = delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_aa619bed5b36c23065f6b3c1faf8ac31d.html#aa619bed5b36c23065f6b3c1faf8ac31d">deltaX</a>;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;  <span class="keywordtype">int</span> dy = delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a73ca8a4921ccb094005e774b883df68d.html#a73ca8a4921ccb094005e774b883df68d">deltaY</a>;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;  <span class="keywordtype">int</span> dz = delta-&gt;<a class="code" href="structfabgl_1_1_mouse_delta_a0653e51f2a47ce4166ce2aec3eb3dafb.html#a0653e51f2a47ce4166ce2aec3eb3dafb">deltaZ</a>;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;  int64_t now   = esp_timer_get_time();</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;  <span class="keywordtype">int</span> deltaTime = now - m_prevDeltaTime; <span class="comment">// time in microseconds</span></div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;  <span class="keywordflow">if</span> (deltaTime &lt; maxDeltaTimeUS) {</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    <span class="comment">// calculate movement acceleration</span></div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="keywordflow">if</span> (dx != 0 || dy != 0) {</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;      <span class="keywordtype">int</span>   deltaDist    = isqrt(dx * dx + dy * dy);                 <span class="comment">// distance in mouse points</span></div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;      <span class="keywordtype">float</span> vel          = (float)deltaDist / deltaTime;             <span class="comment">// velocity in mousepoints/microsecond</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;      <span class="keywordtype">float</span> newVel       = vel + m_movementAcceleration * vel * vel; <span class="comment">// new velocity</span></div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;      <span class="keywordtype">int</span>   newDeltaDist = newVel * deltaTime;                       <span class="comment">// new distance</span></div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;      dx = dx * newDeltaDist / deltaDist;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;      dy = dy * newDeltaDist / deltaDist;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    }</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    <span class="comment">// calculate wheel acceleration</span></div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;    <span class="keywordflow">if</span> (dz != 0) {</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;      <span class="keywordtype">int</span>   deltaDist    = abs(dz);                                  <span class="comment">// distance in wheel points</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;      <span class="keywordtype">float</span> vel          = (float)deltaDist / deltaTime;             <span class="comment">// velocity in mousepoints/microsecond</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;      <span class="keywordtype">float</span> newVel       = vel + m_wheelAcceleration * vel * vel;    <span class="comment">// new velocity</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;      <span class="keywordtype">int</span>   newDeltaDist = newVel * deltaTime;                       <span class="comment">// new distance</span></div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;      dz = dz * newDeltaDist / deltaDist;</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;    }</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;  }</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a>           = tclamp((<span class="keywordtype">int</span>)m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a> + dx, 0, m_area.<a class="code" href="structfabgl_1_1_size_ae0ffb42440f0305b6d22a1c6106b6e6f.html#ae0ffb42440f0305b6d22a1c6106b6e6f">width</a>  - 1);</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a>           = tclamp((<span class="keywordtype">int</span>)m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a> - dy, 0, m_area.<a class="code" href="structfabgl_1_1_size_a777dd66f9609a587ee98ad50de301662.html#a777dd66f9609a587ee98ad50de301662">height</a> - 1);</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;  m_status.<a class="code" href="structfabgl_1_1_mouse_status_ac1cf6a18b13ddfb1d9d76322097f3c0f.html#ac1cf6a18b13ddfb1d9d76322097f3c0f">wheelDelta</a>  = dz;</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;  m_prevDeltaTime      = now;</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;}</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;<span class="keywordtype">void</span> Mouse::mouseUpdateTask(<span class="keywordtype">void</span> * arg)</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;{</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;  constexpr <span class="keywordtype">int</span> MAX_TIME_BETWEEN_DATA_US = 500000;  <span class="comment">// maximum time between data composing a delta frame</span></div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;  <a class="code" href="classfabgl_1_1_mouse.html">Mouse</a> * mouse = (<a class="code" href="classfabgl_1_1_mouse.html">Mouse</a>*) arg;</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;  int64_t prevDataTime = 0;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;  <span class="keywordflow">while</span> (<span class="keyword">true</span>) {</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;    <a class="code" href="structfabgl_1_1_mouse_packet.html">MousePacket</a> mousePacket;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="keywordtype">int</span> mousePacketLen = 0;</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    <span class="keywordflow">while</span> (mousePacketLen &lt; mouse-&gt;<a class="code" href="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa.html#a9f62cc2900d28231ffc61d200af2aafa">getPacketSize</a>()) {</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;      <span class="keywordtype">int</span> r = mouse-&gt;getData(-1);</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;      <span class="keywordflow">if</span> (mouse-&gt;parityError() || mouse-&gt;syncError()) {</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;        mousePacketLen = 0;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;      }</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;      int64_t now = esp_timer_get_time();</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;      <span class="keywordflow">if</span> (mousePacketLen &gt; 0 &amp;&amp; prevDataTime &gt; 0 &amp;&amp; (now - prevDataTime) &gt; MAX_TIME_BETWEEN_DATA_US) {</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;        <span class="comment">// too much time elapsed since last byte, start a new delta</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        mousePacketLen = 0;</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;      }</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;      <span class="keywordflow">if</span> (r &gt; -1) {</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;        mousePacket.data[mousePacketLen++] = r;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;        prevDataTime = now;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;      }</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    }</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordflow">if</span> (mouse-&gt;m_absoluteUpdate) {</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;      MouseDelta delta;</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;      <span class="keywordflow">if</span> (mouse-&gt;decodeMousePacket(&amp;mousePacket, &amp;delta)) {</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;        mouse-&gt;<a class="code" href="classfabgl_1_1_mouse_af43b281ab7ec8480fc8ea6092f01a12a.html#af43b281ab7ec8480fc8ea6092f01a12a">updateAbsolutePosition</a>(&amp;delta);</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;        <span class="comment">// VGA Controller</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;        <span class="keywordflow">if</span> (mouse-&gt;m_updateDisplayController)</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;          mouse-&gt;m_updateDisplayController-&gt;<a class="code" href="classfabgl_1_1_bitmapped_display_controller_ae0897f2355f7462b5ab003083418e3b4.html#ae0897f2355f7462b5ab003083418e3b4">setMouseCursorPos</a>(mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a>, mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a>);</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;        <span class="comment">// queue (if you need availableStatus() or getNextStatus())</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;        <span class="keywordflow">if</span> (mouse-&gt;m_absoluteQueue) {</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;          xQueueSend(mouse-&gt;m_absoluteQueue, &amp;mouse-&gt;m_status, 0);</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;        }</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;        <span class="keywordflow">if</span> (mouse-&gt;m_uiApp) {</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;          <span class="comment">// generate uiApp events</span></div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;          <span class="keywordflow">if</span> (mouse-&gt;m_prevStatus.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a> != mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">X</a> || mouse-&gt;m_prevStatus.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a> != mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">Y</a>) {</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;            <span class="comment">// X and Y movement: UIEVT_MOUSEMOVE</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;            uiEvent evt = uiEvent(<span class="keyword">nullptr</span>, UIEVT_MOUSEMOVE);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;            evt.params.mouse.status = mouse-&gt;m_status;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;            evt.params.mouse.changedButton = 0;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;            mouse-&gt;m_uiApp-&gt;<a class="code" href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">postEvent</a>(&amp;evt);</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;          }</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;          <span class="keywordflow">if</span> (mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_ac1cf6a18b13ddfb1d9d76322097f3c0f.html#ac1cf6a18b13ddfb1d9d76322097f3c0f">wheelDelta</a> != 0) {</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;            <span class="comment">// wheel movement: UIEVT_MOUSEWHEEL</span></div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;            uiEvent evt = uiEvent(<span class="keyword">nullptr</span>, UIEVT_MOUSEWHEEL);</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;            evt.params.mouse.status = mouse-&gt;m_status;</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;            evt.params.mouse.changedButton = 0;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;            mouse-&gt;m_uiApp-&gt;<a class="code" href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">postEvent</a>(&amp;evt);</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;          }</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;          <span class="keywordflow">if</span> (mouse-&gt;m_prevStatus.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">left</a> != mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">left</a>) {</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;            <span class="comment">// left button: UIEVT_MOUSEBUTTONDOWN, UIEVT_MOUSEBUTTONUP</span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;            uiEvent evt = uiEvent(<span class="keyword">nullptr</span>, mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">left</a> ? UIEVT_MOUSEBUTTONDOWN : UIEVT_MOUSEBUTTONUP);</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;            evt.params.mouse.status = mouse-&gt;m_status;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;            evt.params.mouse.changedButton = 1;</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;            mouse-&gt;m_uiApp-&gt;<a class="code" href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">postEvent</a>(&amp;evt);</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;          }</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;          <span class="keywordflow">if</span> (mouse-&gt;m_prevStatus.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">middle</a> != mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">middle</a>) {</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;            <span class="comment">// middle button: UIEVT_MOUSEBUTTONDOWN, UIEVT_MOUSEBUTTONUP</span></div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;            uiEvent evt = uiEvent(<span class="keyword">nullptr</span>, mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">middle</a> ? UIEVT_MOUSEBUTTONDOWN : UIEVT_MOUSEBUTTONUP);</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;            evt.params.mouse.status = mouse-&gt;m_status;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;            evt.params.mouse.changedButton = 2;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;            mouse-&gt;m_uiApp-&gt;<a class="code" href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">postEvent</a>(&amp;evt);</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;          }</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;          <span class="keywordflow">if</span> (mouse-&gt;m_prevStatus.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">right</a> != mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">right</a>) {</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;            <span class="comment">// right button: UIEVT_MOUSEBUTTONDOWN, UIEVT_MOUSEBUTTONUP</span></div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;            uiEvent evt = uiEvent(<span class="keyword">nullptr</span>, mouse-&gt;m_status.<a class="code" href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">buttons</a>.<a class="code" href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">right</a> ? UIEVT_MOUSEBUTTONDOWN : UIEVT_MOUSEBUTTONUP);</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;            evt.params.mouse.status = mouse-&gt;m_status;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;            evt.params.mouse.changedButton = 3;</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;            mouse-&gt;m_uiApp-&gt;<a class="code" href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">postEvent</a>(&amp;evt);</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;          }</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;        }</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;      }</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;      xQueueOverwrite(mouse-&gt;m_receivedPacket, &amp;mousePacket);</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    }</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;  }</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;}</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;</div><div class="line"><a name="l00371"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_adcc67a74d344caca0d4cbcbdba844519.html#adcc67a74d344caca0d4cbcbdba844519">  371</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="classfabgl_1_1_mouse_adcc67a74d344caca0d4cbcbdba844519.html#adcc67a74d344caca0d4cbcbdba844519">Mouse::availableStatus</a>()</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;{</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;  <span class="keywordflow">return</span> m_absoluteQueue ? uxQueueMessagesWaiting(m_absoluteQueue) : 0;</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;}</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_abc9072ef74a767f7b1f39880df870a96.html#abc9072ef74a767f7b1f39880df870a96">  377</a></span>&#160;<a class="code" href="structfabgl_1_1_mouse_status.html">MouseStatus</a> <a class="code" href="classfabgl_1_1_mouse_abc9072ef74a767f7b1f39880df870a96.html#abc9072ef74a767f7b1f39880df870a96">Mouse::getNextStatus</a>(<span class="keywordtype">int</span> timeOutMS)</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;{</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;  <a class="code" href="structfabgl_1_1_mouse_status.html">MouseStatus</a> <a class="code" href="classfabgl_1_1_mouse_a13ff5f44b3a7fca9f3e1e8d74242365b.html#a13ff5f44b3a7fca9f3e1e8d74242365b">status</a>;</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;  <span class="keywordflow">if</span> (m_absoluteQueue)</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    xQueueReceive(m_absoluteQueue, &amp;<a class="code" href="classfabgl_1_1_mouse_a13ff5f44b3a7fca9f3e1e8d74242365b.html#a13ff5f44b3a7fca9f3e1e8d74242365b">status</a>, msToTicks(timeOutMS));</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classfabgl_1_1_mouse_a13ff5f44b3a7fca9f3e1e8d74242365b.html#a13ff5f44b3a7fca9f3e1e8d74242365b">status</a>;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;}</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">  386</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">Mouse::emptyQueue</a>()</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;{</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;  <span class="keywordflow">while</span> (getData(0) != -1)</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    ;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;  <span class="keywordflow">if</span> (m_absoluteQueue)</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    xQueueReset(m_absoluteQueue);</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;}</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;} <span class="comment">// end of namespace</span></div><div class="ttc" id="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a_html_a1d15efa837d051c0c3107a2a694b344a"><div class="ttname"><a href="structfabgl_1_1_mouse_status_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">fabgl::MouseStatus::buttons</a></div><div class="ttdeci">MouseButtons buttons</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00280">fabutils.h:280</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_a3e4810c2db3fe2f9e3a390156574fcd7_html_a3e4810c2db3fe2f9e3a390156574fcd7"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_a3e4810c2db3fe2f9e3a390156574fcd7.html#a3e4810c2db3fe2f9e3a390156574fcd7">fabgl::MouseDelta::overflowX</a></div><div class="ttdeci">uint8_t overflowX</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00060">mouse.h:60</a></div></div>
<div class="ttc" id="ps2controller_8h_html"><div class="ttname"><a href="ps2controller_8h.html">ps2controller.h</a></div><div class="ttdoc">This file contains fabgl::PS2Controller definition. </div></div>
<div class="ttc" id="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708_html_gga1a15f1712ba14a6877038ffe9c6f7708a64426cb7833b3604fe0ab5d0eec32edf"><div class="ttname"><a href="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708.html#gga1a15f1712ba14a6877038ffe9c6f7708a64426cb7833b3604fe0ab5d0eec32edf">fabgl::LegacyMouse</a></div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00077">mouse.h:77</a></div></div>
<div class="ttc" id="classfabgl_1_1_p_s2_device_aae07d4bbfd23897dc1225821077c8df2_html_aae07d4bbfd23897dc1225821077c8df2"><div class="ttname"><a href="classfabgl_1_1_p_s2_device_aae07d4bbfd23897dc1225821077c8df2.html#aae07d4bbfd23897dc1225821077c8df2">fabgl::PS2Device::lock</a></div><div class="ttdeci">bool lock(int timeOutMS)</div><div class="ttdoc">Gets exclusive access to the device. </div><div class="ttdef"><b>Definition:</b> <a href="ps2device_8cpp_source.html#l00091">ps2device.cpp:91</a></div></div>
<div class="ttc" id="classfabgl_1_1ui_app_html"><div class="ttname"><a href="classfabgl_1_1ui_app.html">fabgl::uiApp</a></div><div class="ttdoc">Represents the whole application base class. </div><div class="ttdef"><b>Definition:</b> <a href="fabui_8h_source.html#l02703">fabui.h:2703</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_packet_html"><div class="ttname"><a href="structfabgl_1_1_mouse_packet.html">fabgl::MousePacket</a></div><div class="ttdoc">Contains raw data received from mouse. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00068">mouse.h:68</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_status_ac1cf6a18b13ddfb1d9d76322097f3c0f_html_ac1cf6a18b13ddfb1d9d76322097f3c0f"><div class="ttname"><a href="structfabgl_1_1_mouse_status_ac1cf6a18b13ddfb1d9d76322097f3c0f.html#ac1cf6a18b13ddfb1d9d76322097f3c0f">fabgl::MouseStatus::wheelDelta</a></div><div class="ttdeci">int8_t wheelDelta</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00279">fabutils.h:279</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_a2a35463fd25699d8601ebe3588973323_html_a2a35463fd25699d8601ebe3588973323"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_a2a35463fd25699d8601ebe3588973323.html#a2a35463fd25699d8601ebe3588973323">fabgl::MouseDelta::overflowY</a></div><div class="ttdeci">uint8_t overflowY</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00061">mouse.h:61</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10_html_a61938d8fca0e953d39df2d9e06f55b10"><div class="ttname"><a href="structfabgl_1_1_mouse_buttons_a61938d8fca0e953d39df2d9e06f55b10.html#a61938d8fca0e953d39df2d9e06f55b10">fabgl::MouseButtons::right</a></div><div class="ttdeci">uint8_t right</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00266">fabutils.h:266</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a47344d7eecf20504d7ea80020aaa0b73_html_a47344d7eecf20504d7ea80020aaa0b73"><div class="ttname"><a href="classfabgl_1_1_mouse_a47344d7eecf20504d7ea80020aaa0b73.html#a47344d7eecf20504d7ea80020aaa0b73">fabgl::Mouse::setSampleRate</a></div><div class="ttdeci">bool setSampleRate(int value)</div><div class="ttdoc">Sets the maximum rate of mouse movements reporting. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00232">mouse.h:232</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa_html_a9f62cc2900d28231ffc61d200af2aafa"><div class="ttname"><a href="classfabgl_1_1_mouse_a9f62cc2900d28231ffc61d200af2aafa.html#a9f62cc2900d28231ffc61d200af2aafa">fabgl::Mouse::getPacketSize</a></div><div class="ttdeci">int getPacketSize()</div><div class="ttdoc">Gets mouse packet size. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00122">mouse.cpp:122</a></div></div>
<div class="ttc" id="fabglconf_8h_a4ed8f72017c1de9d95dedeb6e37b199b_html_a4ed8f72017c1de9d95dedeb6e37b199b"><div class="ttname"><a href="fabglconf_8h_a4ed8f72017c1de9d95dedeb6e37b199b.html#a4ed8f72017c1de9d95dedeb6e37b199b">FABGLIB_MOUSE_EVENTS_QUEUE_SIZE</a></div><div class="ttdeci">#define FABGLIB_MOUSE_EVENTS_QUEUE_SIZE</div><div class="ttdef"><b>Definition:</b> <a href="fabglconf_8h_source.html#l00134">fabglconf.h:134</a></div></div>
<div class="ttc" id="displaycontroller_8h_html"><div class="ttname"><a href="displaycontroller_8h.html">displaycontroller.h</a></div><div class="ttdoc">This file contains fabgl::BitmappedDisplayController definition. </div></div>
<div class="ttc" id="classfabgl_1_1_bitmapped_display_controller_html"><div class="ttname"><a href="classfabgl_1_1_bitmapped_display_controller.html">fabgl::BitmappedDisplayController</a></div><div class="ttdoc">Represents the base abstract class for bitmapped display controllers. </div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00730">displaycontroller.h:730</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_a73ca8a4921ccb094005e774b883df68d_html_a73ca8a4921ccb094005e774b883df68d"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_a73ca8a4921ccb094005e774b883df68d.html#a73ca8a4921ccb094005e774b883df68d">fabgl::MouseDelta::deltaY</a></div><div class="ttdeci">int16_t deltaY</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00057">mouse.h:57</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_html"><div class="ttname"><a href="structfabgl_1_1_mouse_delta.html">fabgl::MouseDelta</a></div><div class="ttdoc">Describes mouse movement and buttons status. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00055">mouse.h:55</a></div></div>
<div class="ttc" id="mouse_8h_html"><div class="ttname"><a href="mouse_8h.html">mouse.h</a></div><div class="ttdoc">This file contains fabgl::Mouse definition. </div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_a0653e51f2a47ce4166ce2aec3eb3dafb_html_a0653e51f2a47ce4166ce2aec3eb3dafb"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_a0653e51f2a47ce4166ce2aec3eb3dafb.html#a0653e51f2a47ce4166ce2aec3eb3dafb">fabgl::MouseDelta::deltaZ</a></div><div class="ttdeci">int8_t deltaZ</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00058">mouse.h:58</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_status_html"><div class="ttname"><a href="structfabgl_1_1_mouse_status.html">fabgl::MouseStatus</a></div><div class="ttdoc">Describes mouse absolute position, scroll wheel delta and buttons status. </div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00276">fabutils.h:276</a></div></div>
<div class="ttc" id="classfabgl_1_1_p_s2_device_ad71b1d9186542ee488f761280b7b76da_html_ad71b1d9186542ee488f761280b7b76da"><div class="ttname"><a href="classfabgl_1_1_p_s2_device_ad71b1d9186542ee488f761280b7b76da.html#ad71b1d9186542ee488f761280b7b76da">fabgl::PS2Device::identify</a></div><div class="ttdeci">PS2DeviceType identify()</div><div class="ttdoc">Identifies the device attached to the PS2 port. </div><div class="ttdef"><b>Definition:</b> <a href="ps2device_8h_source.html#l00079">ps2device.h:79</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_abc9072ef74a767f7b1f39880df870a96_html_abc9072ef74a767f7b1f39880df870a96"><div class="ttname"><a href="classfabgl_1_1_mouse_abc9072ef74a767f7b1f39880df870a96.html#abc9072ef74a767f7b1f39880df870a96">fabgl::Mouse::getNextStatus</a></div><div class="ttdeci">MouseStatus getNextStatus(int timeOutMS=-1)</div><div class="ttdoc">Gets the next status from the status queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00377">mouse.cpp:377</a></div></div>
<div class="ttc" id="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708_html_gga1a15f1712ba14a6877038ffe9c6f7708a2e71c963cb7659a2783aa306391051ec"><div class="ttname"><a href="group___enumerations_ga1a15f1712ba14a6877038ffe9c6f7708.html#gga1a15f1712ba14a6877038ffe9c6f7708a2e71c963cb7659a2783aa306391051ec">fabgl::Intellimouse</a></div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00078">mouse.h:78</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845_html_aefe587a398d3614e3da20cad4b8e2845"><div class="ttname"><a href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">fabgl::Mouse::emptyQueue</a></div><div class="ttdeci">void emptyQueue()</div><div class="ttdoc">Empties the mouse status and events queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00386">mouse.cpp:386</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450_html_a7b197ff052f8e1d25bfed56da9fa0450"><div class="ttname"><a href="structfabgl_1_1_mouse_buttons_a7b197ff052f8e1d25bfed56da9fa0450.html#a7b197ff052f8e1d25bfed56da9fa0450">fabgl::MouseButtons::middle</a></div><div class="ttdeci">uint8_t middle</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00265">fabutils.h:265</a></div></div>
<div class="ttc" id="namespacefabgl_html"><div class="ttname"><a href="namespacefabgl.html">fabgl</a></div><div class="ttdef"><b>Definition:</b> <a href="canvas_8cpp_source.html#l00036">canvas.cpp:36</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a231264f15f33e8986765d7644c0c3615_html_a231264f15f33e8986765d7644c0c3615"><div class="ttname"><a href="classfabgl_1_1_mouse_a231264f15f33e8986765d7644c0c3615.html#a231264f15f33e8986765d7644c0c3615">fabgl::Mouse::deltaAvailable</a></div><div class="ttdeci">bool deltaAvailable()</div><div class="ttdoc">Determines if there is a mouse movement available in the queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00140">mouse.cpp:140</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a3fd3cdfc66306ff22b53325aeb4e2c64_html_a3fd3cdfc66306ff22b53325aeb4e2c64"><div class="ttname"><a href="classfabgl_1_1_mouse_a3fd3cdfc66306ff22b53325aeb4e2c64.html#a3fd3cdfc66306ff22b53325aeb4e2c64">fabgl::Mouse::packetAvailable</a></div><div class="ttdeci">bool packetAvailable()</div><div class="ttdoc">Determines if there is a raw mouse movement available in the queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00128">mouse.cpp:128</a></div></div>
<div class="ttc" id="structfabgl_1_1_size_ae0ffb42440f0305b6d22a1c6106b6e6f_html_ae0ffb42440f0305b6d22a1c6106b6e6f"><div class="ttname"><a href="structfabgl_1_1_size_ae0ffb42440f0305b6d22a1c6106b6e6f.html#ae0ffb42440f0305b6d22a1c6106b6e6f">fabgl::Size::width</a></div><div class="ttdeci">int16_t width</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00209">fabutils.h:209</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_a1d15efa837d051c0c3107a2a694b344a_html_a1d15efa837d051c0c3107a2a694b344a"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_a1d15efa837d051c0c3107a2a694b344a.html#a1d15efa837d051c0c3107a2a694b344a">fabgl::MouseDelta::buttons</a></div><div class="ttdeci">MouseButtons buttons</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00059">mouse.h:59</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a3f7c9c26b1d53a42eda487efa8f7e546_html_a3f7c9c26b1d53a42eda487efa8f7e546"><div class="ttname"><a href="classfabgl_1_1_mouse_a3f7c9c26b1d53a42eda487efa8f7e546.html#a3f7c9c26b1d53a42eda487efa8f7e546">fabgl::Mouse::terminateAbsolutePositioner</a></div><div class="ttdeci">void terminateAbsolutePositioner()</div><div class="ttdoc">Terminates absolute position handler. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00224">mouse.cpp:224</a></div></div>
<div class="ttc" id="structfabgl_1_1_size_a777dd66f9609a587ee98ad50de301662_html_a777dd66f9609a587ee98ad50de301662"><div class="ttname"><a href="structfabgl_1_1_size_a777dd66f9609a587ee98ad50de301662.html#a777dd66f9609a587ee98ad50de301662">fabgl::Size::height</a></div><div class="ttdeci">int16_t height</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00210">fabutils.h:210</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a11d4bf156584e08773498e4de00ca1ff_html_a11d4bf156584e08773498e4de00ca1ff"><div class="ttname"><a href="classfabgl_1_1_mouse_a11d4bf156584e08773498e4de00ca1ff.html#a11d4bf156584e08773498e4de00ca1ff">fabgl::Mouse::getNextPacket</a></div><div class="ttdeci">bool getNextPacket(MousePacket *packet, int timeOutMS=-1, bool requestResendOnTimeOut=false)</div><div class="ttdoc">Gets a mouse raw movement (packet) from the queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00134">mouse.cpp:134</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a72788b215173ebeed6b8fe0f40368c90_html_a72788b215173ebeed6b8fe0f40368c90"><div class="ttname"><a href="classfabgl_1_1_mouse_a72788b215173ebeed6b8fe0f40368c90.html#a72788b215173ebeed6b8fe0f40368c90">fabgl::Mouse::getNextDelta</a></div><div class="ttdeci">bool getNextDelta(MouseDelta *delta, int timeOutMS=-1, bool requestResendOnTimeOut=false)</div><div class="ttdoc">Gets a mouse movement from the queue. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00187">mouse.cpp:187</a></div></div>
<div class="ttc" id="structfabgl_1_1_size_html"><div class="ttname"><a href="structfabgl_1_1_size.html">fabgl::Size</a></div><div class="ttdoc">Represents a bidimensional size. </div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00208">fabutils.h:208</a></div></div>
<div class="ttc" id="classfabgl_1_1_bitmapped_display_controller_ae0897f2355f7462b5ab003083418e3b4_html_ae0897f2355f7462b5ab003083418e3b4"><div class="ttname"><a href="classfabgl_1_1_bitmapped_display_controller_ae0897f2355f7462b5ab003083418e3b4.html#ae0897f2355f7462b5ab003083418e3b4">fabgl::BitmappedDisplayController::setMouseCursorPos</a></div><div class="ttdeci">void setMouseCursorPos(int X, int Y)</div><div class="ttdoc">Sets mouse cursor position. </div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8cpp_source.html#l00690">displaycontroller.cpp:690</a></div></div>
<div class="ttc" id="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e_html_a17b03b92f0606f56dcf3b61b6c85c48e"><div class="ttname"><a href="classfabgl_1_1ui_app_a17b03b92f0606f56dcf3b61b6c85c48e.html#a17b03b92f0606f56dcf3b61b6c85c48e">fabgl::uiApp::postEvent</a></div><div class="ttdeci">bool postEvent(uiEvent const *event)</div><div class="ttdoc">Places an event in the event queue and returns without waiting for the receiver to process the event...</div><div class="ttdef"><b>Definition:</b> <a href="fabui_8cpp_source.html#l00536">fabui.cpp:536</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a13ff5f44b3a7fca9f3e1e8d74242365b_html_a13ff5f44b3a7fca9f3e1e8d74242365b"><div class="ttname"><a href="classfabgl_1_1_mouse_a13ff5f44b3a7fca9f3e1e8d74242365b.html#a13ff5f44b3a7fca9f3e1e8d74242365b">fabgl::Mouse::status</a></div><div class="ttdeci">MouseStatus &amp; status()</div><div class="ttdoc">Gets or sets current mouse status. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00313">mouse.h:313</a></div></div>
<div class="ttc" id="group___enumerations_gab1e29a3412c837d0e4e7599473e8948f_html_ggab1e29a3412c837d0e4e7599473e8948fa7b1bf224080b249a7253c8c26f56b13f"><div class="ttname"><a href="group___enumerations_gab1e29a3412c837d0e4e7599473e8948f.html#ggab1e29a3412c837d0e4e7599473e8948fa7b1bf224080b249a7253c8c26f56b13f">fabgl::PS2DeviceType::MouseWithScrollWheel</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_adcc67a74d344caca0d4cbcbdba844519_html_adcc67a74d344caca0d4cbcbdba844519"><div class="ttname"><a href="classfabgl_1_1_mouse_adcc67a74d344caca0d4cbcbdba844519.html#adcc67a74d344caca0d4cbcbdba844519">fabgl::Mouse::availableStatus</a></div><div class="ttdeci">int availableStatus()</div><div class="ttdoc">Gets the number of available mouse status. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00371">mouse.cpp:371</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798_html_a56921ef9b7157bb48751c7517531a798"><div class="ttname"><a href="classfabgl_1_1_mouse_a56921ef9b7157bb48751c7517531a798.html#a56921ef9b7157bb48751c7517531a798">fabgl::Mouse::begin</a></div><div class="ttdeci">void begin(gpio_num_t clkGPIO, gpio_num_t dataGPIO)</div><div class="ttdoc">Initializes Mouse specifying CLOCK and DATA GPIOs. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00083">mouse.cpp:83</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_delta_aa619bed5b36c23065f6b3c1faf8ac31d_html_aa619bed5b36c23065f6b3c1faf8ac31d"><div class="ttname"><a href="structfabgl_1_1_mouse_delta_aa619bed5b36c23065f6b3c1faf8ac31d.html#aa619bed5b36c23065f6b3c1faf8ac31d">fabgl::MouseDelta::deltaX</a></div><div class="ttdeci">int16_t deltaX</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00056">mouse.h:56</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_af43b281ab7ec8480fc8ea6092f01a12a_html_af43b281ab7ec8480fc8ea6092f01a12a"><div class="ttname"><a href="classfabgl_1_1_mouse_af43b281ab7ec8480fc8ea6092f01a12a.html#af43b281ab7ec8480fc8ea6092f01a12a">fabgl::Mouse::updateAbsolutePosition</a></div><div class="ttdeci">void updateAbsolutePosition(MouseDelta *delta)</div><div class="ttdoc">Updates absolute position from the specified mouse delta event. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00236">mouse.cpp:236</a></div></div>
<div class="ttc" id="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594_html_adcf201a8aabf55cb352ec05331242594"><div class="ttname"><a href="displaycontroller_8h_adcf201a8aabf55cb352ec05331242594.html#adcf201a8aabf55cb352ec05331242594">height</a></div><div class="ttdeci">uint8_t height</div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00323">displaycontroller.h:323</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e_html_a70cfd618738e7ccc6476c05b5ec2490e"><div class="ttname"><a href="structfabgl_1_1_mouse_buttons_a70cfd618738e7ccc6476c05b5ec2490e.html#a70cfd618738e7ccc6476c05b5ec2490e">fabgl::MouseButtons::left</a></div><div class="ttdeci">uint8_t left</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00264">fabutils.h:264</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_html"><div class="ttname"><a href="classfabgl_1_1_mouse.html">fabgl::Mouse</a></div><div class="ttdoc">The PS2 Mouse controller class. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00111">mouse.h:111</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a3a139c6e0877d280a65924a0092a7f76_html_a3a139c6e0877d280a65924a0092a7f76"><div class="ttname"><a href="classfabgl_1_1_mouse_a3a139c6e0877d280a65924a0092a7f76.html#a3a139c6e0877d280a65924a0092a7f76">fabgl::Mouse::setupAbsolutePositioner</a></div><div class="ttdeci">void setupAbsolutePositioner(int width, int height, bool createAbsolutePositionsQueue, BitmappedDisplayController *updateDisplayController=nullptr, uiApp *app=nullptr)</div><div class="ttdoc">Initializes absolute position handler. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00194">mouse.cpp:194</a></div></div>
<div class="ttc" id="classfabgl_1_1_mouse_a50910ef42a65d4c139af341f1ef2323f_html_a50910ef42a65d4c139af341f1ef2323f"><div class="ttname"><a href="classfabgl_1_1_mouse_a50910ef42a65d4c139af341f1ef2323f.html#a50910ef42a65d4c139af341f1ef2323f">fabgl::Mouse::reset</a></div><div class="ttdeci">bool reset()</div><div class="ttdoc">Sends a Reset command to the mouse. </div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00091">mouse.cpp:91</a></div></div>
<div class="ttc" id="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476_html_a09a2a45f731b02946ff6d3cd15c1a476"><div class="ttname"><a href="displaycontroller_8h_a09a2a45f731b02946ff6d3cd15c1a476.html#a09a2a45f731b02946ff6d3cd15c1a476">width</a></div><div class="ttdeci">uint8_t width</div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00322">displaycontroller.h:322</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17_html_abe4637362df8e341470401813999dd17"><div class="ttname"><a href="structfabgl_1_1_mouse_status_abe4637362df8e341470401813999dd17.html#abe4637362df8e341470401813999dd17">fabgl::MouseStatus::Y</a></div><div class="ttdeci">int16_t Y</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00278">fabutils.h:278</a></div></div>
<div class="ttc" id="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57_html_aa6aba27bc1a89db9e350b50bbf881f57"><div class="ttname"><a href="structfabgl_1_1_mouse_status_aa6aba27bc1a89db9e350b50bbf881f57.html#aa6aba27bc1a89db9e350b50bbf881f57">fabgl::MouseStatus::X</a></div><div class="ttdeci">int16_t X</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l00277">fabutils.h:277</a></div></div>
<div class="ttc" id="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09_html_ab8520612804a921ad834b41214a99c09"><div class="ttname"><a href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">fabgl::PS2Controller::begin</a></div><div class="ttdeci">static void begin(gpio_num_t port0_clkGPIO, gpio_num_t port0_datGPIO, gpio_num_t port1_clkGPIO=GPIO_UNUSED, gpio_num_t port1_datGPIO=GPIO_UNUSED)</div><div class="ttdoc">Initializes PS2 device controller. </div><div class="ttdef"><b>Definition:</b> <a href="ps2controller_8cpp_source.html#l01115">ps2controller.cpp:1115</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_82e8a5453e51b0b6168db3257bd0eaab.html">devdrivers</a></li><li class="navelem"><b>mouse.cpp</b></li>
    <li class="footer">Generated on Mon Aug 2 2021 07:08:03 for FabGL by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  </ul>
</div>
</body>
</html>
